package gybase04

/**
 ********************************************************
 * Author: chinadragon
 * Time: 2021/12/26 下午5:38
 * Name: MOP 元对象协议 Meta object protocol
 *          元编程
 * Overview:
 * Usage:
 ********************************************************
 *
 * 实现方法拦截 : 使用metaClass进行拦截
 */
class PersonMop2{
    def func(){
//        println" i hava a dream"
        System.out.println(" i hava a dream")
    }

}

def personMop2 = new PersonMop2()

/*
//拦截某个对象的某个方法
personMop2.metaClass.func = {
    println" i hava a dream 这个里是拦截后的方法"
}

personMop2.func()*/
// i hava a dream 这个里是拦截后的方法

//拦截多个方法， 等价于实现拦截接口 GroovyInterceptable
personMop2.metaClass.invokeMethod = {
    String name,Object args -> //invokeMethod(String name, Object args)
        println"$name 被拦截"
}

personMop2.func()//只对当前对象拦截
//new PersonMop2().func()
//new PersonMop2().func()
//func 被拦截
// i hava a dream
// i hava a dream

// 对所有对象拦截
PersonMop2.metaClass.invokeMethod = {
    String name,Object args -> //invokeMethod(String name, Object args)
        println"PersonMop2.metaClass   $name 被拦截"
}
personMop2.func()
new PersonMop2().func()
new PersonMop2().func()
//func 被拦截
//PersonMop2.metaClass   func 被拦截
//PersonMop2.metaClass   func 被拦截

String.metaClass.invokeMethod = {
    String name,Object args -> //invokeMethod(String name, Object args)
        println"String.metaClass   $name 被拦截"

      MetaMethod metaMethod =   delegate.metaClass.getMetaMethod(name)
        if (metaMethod != null && name == 'toString'){
            'dragon'
        }
}

println"test tostring".toString()
//String.metaClass   toString 被拦截
//dragon


